const db = require('../db/index')
// bcryptjs 加密之后的密码，无法被逆向破解。同一明文密码多次加密，得到的加密结果各不相同，保证了安全性
const bcrypt = require('bcryptjs')

// 导入生成 token 的包
const jwt = require('jsonwebtoken')

// 导入配置文件
const config = require('../config')

// 导出注册
exports.reguser = (req, res) => {
  const userinfo = req.body
  //判断用户名和密码是否为空
  if (!userinfo.username || !userinfo.password) {
    return res.cc('用户名或密码不能为空！')
  }
  // 检测用户名是否被占用
  const sql = `select * from ev_users where username = ?`
  db.query(sql, userinfo.username, (err, results) => {
    // 查询失败
    if (err) return res.cc(err)
    // 如果查询到有和 userinfo.username 相同的数据，表示用户名被占用, 则 results.length > 0
    if (results.length > 0) {
      return res.cc('用户名被占用，请更换其他用户名！')
    }
    // bcrypt.hashSync 对密码进行加密
    // bcrypt.hashSync(明文密码, 加密次数)
    userinfo.password = bcrypt.hashSync(userinfo.password, 10)
    const sqlStr = `insert into ev_users set ?`
    db.query(sqlStr, { username: userinfo.username, password: userinfo.password }, (err, result) => {
      if (err) return res.cc(err)
      if (result.affectedRows !== 1) return res.cc('注册用户失败')
      res.cc('注册成功', 0)
    })
  })

}

// 导出登录
exports.login = (req, res) => {
  const userinfo = req.body
  const sql = `select * from ev_users where username = ?`
  db.query(sql, userinfo.username, (err, results) => {
    if (err) return res.cc(err)
    if (results.length !== 1) return res.cc('登录失败！')
    // bcrypt.compareSync(用户提交的密码, 数据库中的密码) 判断密码是否正确
    const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
    if (!compareResult) {
      return res.cc('密码错误！')
    }
    // 生成 Token 字符串的时候，一定要剔除 密码 和 头像 的值
    const user = { ...results[0], password: '', user_pic: '' }
    // 通过 jwt.sign() 方法生成 Token 字符串，
    // 第一个参数是用户的信息对象，
    // 第二个参数是加密的秘钥，
    // 第三个参数是有效期时间
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
    res.send({
      status: 0,
      message: '登录成功！',
      token: 'Bearer ' + tokenStr
    })
  })
}